package async_op

import (
	"sen-golang-study/go_game_study/hero_story_go_server/common/log"
	"sen-golang-study/go_game_study/hero_story_go_server/common/main_thread"
)

// 工人、苦力、搬砖的...
type worker struct {
	// 任务队列
	taskQ chan func()
}

// 处理异步操作,
// 只是将异步操作和继续执行过程加入到队列里,
// 并不是立即就处理...
// asyncOp = 异步操作函数
// continueWith = 继续执行过程, 将在主线程中调用
func (w *worker) process(asyncOp func(), continueWith func()) {
	if nil == asyncOp {
		log.Error("异步操作为空")
		return
	}

	if nil == w.taskQ {
		log.Error("任务队列尚未初始化")
		return
	}

	// 将 asyncOp 和 continueWith 包装成一个新函数,
	// 插入到任务队列...
	w.taskQ <- func() {
		// 执行异步操作
		asyncOp()

		if nil != continueWith {
			// 通过主线程继续执行
			main_thread.PushTask(continueWith)
		}
	}
}

// 循环执行任务
func (w *worker) loopExecTask() {
	if nil == w.taskQ {
		log.Error("任务队列尚未初始化")
		return
	}

	for {
		task := <-w.taskQ

		if nil != task {
			task()
		}
	}
}
